﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Demo03
{
    /*   1、定义一个方法，求一个整数数组中的最大值，最小值，和，平均数。
     *   如果是一个方法只能有一个返回值，那只能每一个都得定义一个方法来实现，
     *   不过有了ref和out这实现起来就方便多了。

   参考步骤：
   定义一个一维数组，数组中存放一些数据（控制台输入）。
   定义几个变量：max、min、sum、avg

   定义一个方法，方法返回数组元素之和,方法形参有max min avg。

   请用ref和out各做一遍，并在注释中，描述他们的区别。*/


    /*区别：ref 关键字使参数按引用传递。其效果是，当控制权传递回调用方法时，在方法中对参数所做的任何更改都将反映在该变量中。若要使用 ref 参数，则方法定义和调用方法都必须显式使用 ref 关键字。

    out 关键字会导致参数通过引用来传递。这与 ref 关键字类似，不同之处在于 ref 要求变量必须在传递之前进行初始化。若要使用 out 参数，方法定义和调用方法都必须显式使用 out 关键字。*/
    class Program
    {
        static void Main(string[] args)
        {
            int[] arr = new int[6];
            for (int i = 0; i < arr.Length; i++)
            {
                while (true)
                {
                    try
                    {
                        Console.WriteLine($"请存入第{i + 1}个数据，数据类型为int");
                        arr[i] = Convert.ToInt32(Console.ReadLine());
                        break;
                    }
                    catch (Exception)
                    {
                        Console.WriteLine("请重新输入");
                    }
                }
            }
            int max1 = arr[0];
            int min1 = arr[0];
            double avg1 = 0;
            int sum1 = GetSum1(arr, ref max1, ref min1, ref avg1);
            Console.WriteLine($"ref ---- sum:{sum1},min:{min1},max:{max1},avg:{avg1}");
            int max2;
            int min2;
            double avg2;
            int sum2 = GetSum2(arr, out max2, out min2, out avg2);
            Console.WriteLine($"out --- sum:{sum2},min:{min2},max:{max2},avg:{avg2}");
        }

        static int GetSum2(int[] arr, out int max, out int min, out double avg)
        {
            int sum = 0;
            max = arr[0];
            min = arr[0];
            for (int i = 0; i < arr.Length; i++)
            {
                if (arr[i] > max)
                {
                    max = arr[i];
                }
                if (arr[i] < min)
                {
                    min = arr[i];
                }
                sum += arr[i];
            }
            avg = (double)sum / arr.Length;
            return sum;
        }
        static int GetSum1(int[] arr, ref int max, ref int min, ref double avg)
        {
            int sum = 0;
            for (int i = 0; i < arr.Length; i++)
            {
                if (arr[i] > max)
                {
                    max = arr[i];
                }
                if (arr[i] < min)
                {
                    min = arr[i];
                }
                sum += arr[i];
            }
            avg = (double)sum / arr.Length;
            return sum;
        }
    }
}
